﻿#ifndef LINEAREQUATION_H
#define LINEAREQUATION_H

/**
 * @brief cagaus 全选主元高斯消去法
 * @param a n*n 存放方程组的系数矩阵，返回时将被破坏
 * @param b 常数向量
 * @param n 方程组的阶数
 * @param x 返回方程组的解向量
 * @param perm 辅助数组，n 个元素。函数利用这个数组来记录选主元过程中的位置交换。
 * @return 返回0表示原方程组的系数矩阵奇异
 */
int cagaus(double a[], double b[], int n, double x[], int perm[]);

/**
  * @brief cbcgaus 复系数方程组的全选主元高斯消去法
  * @param ar n * n存放复系数矩阵的实部，要被破坏
  * @param ai n * n存放复系数矩阵的虚部，要被破坏
  * @param n 方程组的阶数
  * @param br 存放方程组右端复常数向量的实部，返回时存放解向量的实部
  * @param bi 存放方程组右端复常数向量的虚部，返回时存放解向量的虚部
  * @param perm 辅助数组，n 个元素。函数利用这个数组来记录选主元过程中的位置交换。
  * @return  返回值0表示系数矩阵奇异
  */
int cbcgaus(double ar[], double ai[], int n, double br[], double bi[], int perm[]);

/**
 * @brief ccgj 全选主元高斯-约当消去法
 * @param a  n*n 存放方程组的系数矩阵，返回时将被破坏
 * @param b  n*m常数向量,每列为一组，返回时存放m组解向量
 * @param n  方程组的阶数
 * @param m  方程组右端常数向量的个数
 * @param perm 辅助数组，n 个元素。函数利用这个数组来记录选主元过程中的位置交换。
 * @return 返回0表示原方程组的系数矩阵奇异
 */
int ccgj(double a[], double b[], int n, int m, int perm[]);

/**
 * @brief cdcgj 复系数全选主元高斯-约当消去法
 * @param ar n*n 存放方程组的系数矩阵的实部，返回时将被破坏
 * @param ai n*n 存放方程组的系数矩阵的虚部，返回时将被破坏
 * @param br n*m常数向量的实部,每列为一组，返回时存放m组解向量的实部
 * @param bi n*m常数向量的虚部,每列为一组，返回时存放m组解向量的虚部
 * @param n 方程组的阶数
 * @param m 方程组右端常数向量的个数
 * @param perm 辅助数组，n 个元素。函数利用这个数组来记录选主元过程中的位置交换。
 * @return 返回0表示原方程组的系数矩阵奇异
 */
int cdcgj(double ar[], double ai[], double br[], double bi[], int n, int m, int perm[]);


/**
 * @brief cetrd  求解三对角线方程组的追赶法
 * @param b 存放三对角线矩阵中三对角线上的元素,
 *          存放顺序为a00, a01, a10, a11, a12, a21, a22, a23 ,..., an-1, n-2, an-1, n-1, 就是按行依次存储
 * @param n 方程组的阶数
 * @param m b 的长度，应为 m = 3n - 2, 本函数中用来做检验
 * @param d 存放方程组右端常数向量，返回时存放解向量
 * @return 1 表示成功，其他表示失败
 */
int cetrd(double b[], int n, int m, double d[]);

/**
 * @brief cfband 一般带型方程组的求解
 * @param b
 * @param d 存放方程组右端常数向量，返回时存放解向量
 * @param n 方程组的阶数
 * @param l 系数矩阵的半带宽
 * @param il 系数矩阵的带宽，应为il=2l+1
 * @param m 方程组右端的常数
 * @return
 */
int cfband(double b[], double d[], int n, int l, int il, int m);

/**
 * @brief cgldl 求解对称方程组的分解法
 * @param a  n*n数组，存放方程组的系数矩阵（应为对称矩阵）
 * @param n  方程组的阶数
 * @param m  方程组右端常数向量的个数
 * @param c  n*m 存放方程组右端的m组常数向量；返回时存放方程组的m组解向量
 * @return   返回值小于0表示程序工作失败，大于0表示正常返回
 */
int cgldl(double a[], int n, int m, double c[]);

/**
 * @brief chchol   求解对称正定方程组的平方根法, 用 Cholesky 分解法（即平方根法）
 * @param a n*n 存放系数矩阵（应为对称正定矩阵），返回时其上三角部分存放分解后的U矩阵
 * @param n 方程的阶数
 * @param m 方程组右端的常数向量的个数
 * @param d n*m 存放方程组右端m组常数向量；返回时，存放方程组的m组解向量
 * @return  返回值小于0，表示程序工作失败
 */
int chchol(double a[], int n, int m, double d[]);

/**
 * @brief ciggj  求解大型稀疏方程组的全选主元高斯-约当消去法,
 *               只是在消去过程中避免了对零元素的运算，从而可以大大减少运算次数.
 *               本函数不考虑系数矩阵的压缩存储问题
 * @param a n*n数组，存放方程组的系数矩阵，返回时要被破坏
 * @param n 方程组的阶数
 * @param b 存放方程组右端常数向量，返回时存放解向量
 * @param perm
 * @return 返回值为0表示系数矩阵奇异
 */
int ciggj(double a[], int n, double b[], int perm[]);

/**
 * @brief cjtlvs  求解 Toeplitz 型方程组的 Levinson 递推算法
 * @param t  长度为 n 的一维数组，存放对称T型矩阵中的元素t0, t1, ... tn-1
 * @param n  方程组的阶数
 * @param b  长度为 n 的一维数组, 存放方程组右端的常数向量
 * @param x  长度为 n 的一维数组, 返回方程组的解
 * @param s  长度为 n 的一维数组, 辅助用
 * @param y  长度为 n 的一维数组, 辅助用
 * @return  返回值小于 0 表示程序工作失败
 */
int cjtlvs(double t[], int n, double b[], double x[], double s[], double y[]);

#endif // LINEAREQUATION_H
